package com.znsd.zl.utils;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @ClassName BaseController
 * @Description 基础CRUD通用controller控制器 S：业务层接口 T：实体类 K：主键类型
 * @Author jaypdd
 * @Date 2020/8/5 21:21
 * @Version v1.0
 */
@Slf4j
public class BaseController<S extends IService<T>, T, K> {

	@Autowired
	public S service;

	/**
	 * 添加信息
	 * @param t 数据库表对应实体类对象
	 * @return 失败返回500 ，成功0
	 */
	@PostMapping
	public R save(@RequestBody T t) {
		try {
			log.info("【通用Controller】添加信息成功，信息：{}", t);
			return service.save(t) ? R.ok() : R.error("添加失败");
		}catch (Exception e){
			e.printStackTrace();
			return R.error();
		}
	}

	/**
	 * 批量删除信息
	 * @param ids 删除的id集合
	 * @return 失败返回500 ，成功0
	 */
	@DeleteMapping
	public R deleteBatch(@RequestBody List<K> ids) {
		try {
			log.info("【通用Controller】批量删除成功，删除id：{}", ids);
			service.removeByIds((Collection<? extends Serializable>) ids);
		}catch (Exception e){
			e.printStackTrace();
			return R.error("服务器异常，请稍后重试");
		}

		return R.ok();
	}


	/**
	 * 修改信息
	 * @param t 数据库表对应实体类对象
	 * @return 失败返回500 ，成功0
	 */
	@PutMapping
	public R update(@RequestBody T t) {
		try {
			log.info("【通用Controller】修改信息，修改的信息：{}", t);
			return service.updateById(t) ? R.ok() : R.error("修改失败");
		}catch (Exception e){
			e.printStackTrace();
			return R.error("服务器异常，请稍后重试");
		}
	}

	/**
	 * 查询所有
	 * @return list：查询的结果集对象
	 */
	@GetMapping
	public R findAll() {
		try {
			List<T> list = service.list();
			log.info("【通用Controller】查询所有信息，信息列表：{}", list);
			return R.ok().put("list", list);
		}catch (Exception e){
			e.printStackTrace();
			return R.error("服务器异常，请稍后重试");
		}
	}

	/**
	 * 根据id查询
	 * @param id 查询的id
	 * @return data查询的单个对象信息
	 */
	@GetMapping("/{id}")
	public R findAll(@PathVariable("id") K id) {
		try {
			T data = service.getById((Serializable) id);
			log.info("【通用Controller】根据id查询信息，查询的信息：{}：", data);
			return R.ok().put("data", data);
		}catch (Exception e){
			e.printStackTrace();
			return R.error("服务器异常，请稍后重试");
		}
	}

	/**
	 * 分页查询
	 * @param pageNum  当前请求页码
	 * @param pageSize 请求的记录数
	 */
	@GetMapping("/{pageNum}/{pageSize}")
	public R pageFind(Map<String, Object> params,
	                  @PathVariable(name = "pageNum") Integer pageNum,
	                  @PathVariable(name = "pageSize") Integer pageSize) {
		PageUtils pageUtils = null;
		try{
			pageUtils = new PageUtils(service.page(new Page<>(pageNum, pageSize), new QueryWrapper<>()));
		}catch (Exception e) {
			e.printStackTrace();
			return R.error("服务器异常，请稍后重试");
		}
		log.info("【通用Controller】分页查询信息，分页对象：{}", pageUtils);
		return R.ok().put("page", pageUtils);
	}

}
